package com.tdxy.jdbc;

import com.tdxy.jdbc.entity.User;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * JDBC的测试类
 */
public class JdbcMain {
    // jdbc 协议 是java mysql 的连接数据库, 实现数据传输的协议。
    // 协议头 : jdbc:mysql://
    // local : 访问数据库的IP地址 127.0.0.1  或都是 localhost
    // port  : 访问数据库的端口号 默认端口是 3306 本机是3309
    // 直接使用某一个库 , 只对表进行相关操作 use db_tdxy ;
    public static final String URL = "jdbc:mysql://127.0.0.1:3309/db_tdxy";
    public static final String USER = "root";
    public static final String PWD = "root";    // 压缩包mysql数据库密码应该是 root@123

    public static void main(String[] args) throws Exception {
        // 1.通过反射加载驱动类
        // 通过参数给定的字符串找到指定的类, 加载到程序当中
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection(URL, USER, PWD);

        // 2. 创建一个预处理 sql 操作语句 , 如果需要填写值, 直接用? 替代。
        String sql = "select * from tb_user where name = ? and password = ?";
        // 2.1 创建表
        // 3. 创建预处理操作对象
        PreparedStatement prestat = conn.prepareStatement(sql);
        prestat.setString(1,"admin");// 补充 ? 号的值
        prestat.setString(2,"admin");
        // 4. 执行查询语句
        ResultSet res = prestat.executeQuery();
        // 遍历集合的下一项  res.next() 是判断 集合中是否有值, 如果有值
        List<User> list = new ArrayList<>();
        // <User> 标明当前list集合只能添加 User 对象
        while (res.next()){
            User user = new User();
            // 从数据库中获取到值 res, 再通过字段给 User 实例赋值
            user.setId((int) res.getObject(1)); // 拿到第一个字段的对应值
            user.setName((String) res.getObject(2));
            user.setPassword((String) res.getObject(3));
            // 将实例添加进集合
            list.add(user);
        }
        // 判定用户是否能登陆 list.size()>0 表示查询到了数据
        if (list.size()>0){
            System.out.println("欢迎您,"+list.get(0).getName());
        }else{
            System.out.println("您输入的用户名或密码错误, 请查证后再次输入");
        }

        // 涉及到查询的时候会有3 个流需要关闭
        res.close();
        prestat.close();
        conn.close();




    }
}
